home *** CD-ROM | disk | FTP | other *** search
- ; swint.asm - software interrupt function
- ;
- ; structure for register values is
- ; struct regval{ unsigned ax,bx,cx,dx,si,di,ds,es; } ;
- ; the following defines the offsets for use in the asm. functions
- ;
- regs struc
- reg_ax dw 0 ; ax value
- reg_bx dw 0 ; bx value
- reg_cx dw 0 ; cx value
- reg_dx dw 0 ; dx value
- reg_si dw 0 ; si value
- reg_di dw 0 ; di value
- reg_bp dw 0 ; bp value
- reg_sp dw 0 ; sp value
- reg_ds dw 0 ; ds value
- reg_es dw 0 ; es value
- reg_ss dw 0 ; ss value
- reg_cs dw 0 ; cs value
- regs ends
- ;
- ; start data section
- include begdata.ha
- include enddata.ha
- ;
- ; start code section
- include begcode.ha
- ;
- ; execute in ROM BIOS s/w int 10H with registers ax-dx set up
- ;
- ; typedef struct
- ; { word16 ax,bx,cx,dx,si,di,sp,bp,ds,es,ss,cs; } REGS ;
- ; REGS sregs , /* input register values */
- ; dregs ; /* values returned in regs */
- ; int fun_no ; /* number of function to execute */
- ;
- ; ax_value = vidint(fun_no,&input_regs,&return_regs);
- vid_args struc ; input arguments
- dw 0 ; saved BP value
- dw 0 ; return address
- fun_no dw 0 ; specific function reqyested (AH value)
- vid_sreg dw 0 ; address of input reg. values
- vid_dreg dw 0 ; store returned reg. values here
- vid_args ends
- ;
- public vidint
- vidint:
- push bp
- mov bp,sp ; set our argument pointer
- push si ; save current register values
- push di ;
- mov bx,word ptr vid_sreg[bp] ; get input reg. val. addr.
- mov ax,word ptr reg_ax[bx] ; place values in registers
- mov cx,word ptr reg_cx[bx]
- mov dx,word ptr reg_dx[bx]
- mov bx,word ptr reg_bx[bx]
- mov ah,byte ptr fun_no[bp]
- int 16 ; VIEDO I/O ROM BIOS call
- mov di,word ptr vid_dreg[bp] ; get return reg. area addr.
- mov word ptr reg_ax[di],ax ; store register values there
- mov word ptr reg_bx[di],bx
- mov word ptr reg_cx[di],cx
- mov word ptr reg_dx[di],dx
- pop di ; restore register values
- pop si
- pop bp
- ret
- ;
- ;
- ; execute an s/w function call with all registers set up
- ;
- ; typedef struct
- ; { word16 ax,bx,cx,dx,si,di,sp,bp,ds,es,ss,cs; } REGS ;
- ; REGS sregs , /* input register values */
- ; dregs ; /* values returned in regs */
- ; int status ; /* 8088 status flags returned by the INT call
- ;
- ; status = swint(fun_code,&input_regs,&return_regs) ;
- swint_args struc ; input arguments
- dw 0 ; saved BP value
- dw 0 ; return address
- int_no dw 0 ; number of software interrupt to issue
- sw_sreg dw 0 ; address of input reg. values
- sw_dreg dw 0 ; store returned reg. values here
- swint_args ends
- ;
- public swint
- swint:
- push bp
- mov bp,sp ; set our arg pointer
- push ds ; save current register values
- push es
- push si
- push di
- mov al,byte ptr int_no[bp] ; insert int, no. into instr.
- mov cs:byte ptr int_instr[1],al
- mov bx,word ptr sw_sreg[bp] ; get input reg. values addr.
- mov ax,word ptr reg_ax[bx] ; place values in registers
- mov cx,word ptr reg_cx[bx]
- mov dx,word ptr reg_dx[bx]
- mov si,word ptr reg_si[bx]
- mov di,word ptr reg_di[bx]
- mov es,word ptr reg_es[bx]
- mov ds,word ptr reg_ds[bx]
- mov bx,ss:word ptr reg_bx[bx]
- int_instr:
- int 32 ; dummy int. (no. filled in on each use
- mov bp,word ptr sw_dreg[bp] ; get & dreg structure
- mov word ptr reg_ax[bp],ax ; store register values in
- mov word ptr reg_bx[bp],bx ; return reg. structure
- mov word ptr reg_cx[bp],cx
- mov word ptr reg_dx[bp],dx
- mov word ptr reg_si[bp],si
- mov word ptr reg_di[bp],di
- mov word ptr reg_ds[bp],ds
- mov word ptr reg_es[bp],es
- pushf ; return flags
- pop ax ; in ax
- cld ; make sure D flag is cleared on return
- pop di ; restore registers
- pop si
- pop es
- pop ds
- pop bp
- ret
- ;
- include endcode.ha
- end
- ;
- ;
-